package main

import (
	"fmt"
	"sync"
)

/*
*
close(jobs) 是非常关键的一行代码，它的作用是 关闭 channel

	for num := range jobs {
	    // 处理 num
	}

只要 channel 中还有数据就读取，直到 channel 被关闭
如果不关闭 channel：
这个 for range 循环 永远不会退出。
所有消费者会一直等待“下一条数据”，导致 WaitGroup 一直不为 0，主函数无法退出。
程序就会 死锁（deadlock）。
这个循环什么时候停止？	当 channel 被关闭并且所有缓存数据都被读取完毕时
*/

// 有没有可能先执行 close(jobs)，关闭 channel，然后消费者才开始运行，导致它读取不到数据？
//
// Go 的 channel 在关闭后，仍然可以读取其中已发送但尚未被消费的数据。即使 close(jobs) 先执行，消费者依然能读取完所有已发送的数据，直到所有数据读完后才会退出循环。

// 环会退出：	当 channel 被关闭 且 所有缓存数据被读取完后
func main() {
	// 创建带缓冲的 channel，用于传递任务
	const taskCount = 100
	const workerCount = 10

	jobs := make(chan int, taskCount)
	var wg sync.WaitGroup

	// 启动 10 个消费者
	for w := 1; w <= workerCount; w++ {
		wg.Add(1)
		go func(workerID int) {
			defer wg.Done()
			for num := range jobs {
				fmt.Printf("Worker %d processed number: %d\n", workerID, num)
			}
		}(w)
	}

	// 生产者：发送 1 到 100 的数字到 channel 中
	for i := 1; i <= taskCount; i++ {
		jobs <- i
	}
	close(jobs) // 所有任务发送完成，关闭 channel

	// 等待所有消费者处理完毕
	wg.Wait()
	fmt.Println("All tasks have been processed.")
}
